���⻰��������дbytebuffer���֪ʶ��ģ�<a href="https://my.oschina.net/u/257950" target="_blank">����С��</a>���˸�protobuf�����⣬��<a href="https://www.oschina.net/p/t-io" target="_blank">t-io</a>�������иպ�Ҳ�õ���protobuf�����Ǿ��Ȱ�protobuf��֪ʶд��һ�¡�

<ol>
	<li>
	<h2><strong>Ϊ�ζ�д</strong></h2>
	ĿǰΪֹ��2017-04-23��Ϊֹ��protobuf�Ǳ��˱Ƚ��Ƴ��һ����Ϣ��ʽ��ԭ������

	<ol>
		<li>���С��ͬ���Ķ������������ԼΪjson��1/8</li>
		<li>��������ٶȿ죬���ûʲô��˵�ģ�˭��ϲ���ٶȿ�Ķ����أ�</li>
		<li>"������"������ֻ��Ҫдһ��xxx.proto���������ù�������java��python��c++�����Զ�Ӧ�Ĵ���</li>
	</ol>
	��<a href="https://www.oschina.net/p/t-io" target="_blank">t-io</a>�ṩ�ļ��������У�Ҳ���õ�protobuf�ģ������ڴ�����һ��protobuf���������
	
	</li>
	
	
	<li>
		<h2><strong>����ʶһ��protoԴ�ļ�</strong></h2>
		����ͷ�һ��<a href="https://www.oschina.net/p/t-io" target="_blank">t-io</a>�ṩ��im�������õ���Դ�ļ��ɣ�������������ӡ����ǵ�������ӱȽ�ȫ���ҾͲ�һһ�����ˣ�Դ�ļ�����<a href="https://git.oschina.net/tywo45/t-io/raw/master/src/example/im/common/src/main/protobuf/chat.proto" target="_blank">chat.proto</a>
		��
<pre>
<code class="language-python">syntax = "proto3";
package org.tio.examples.im.common.packets;

option java_package = "org.tio.examples.im.common.packets";  //����java��Ӧ��package
option java_multiple_files = true;                           //��������Ϊtrue��������ÿ���������һ���ļ��У��������ж�����һ��java�ļ���

//����
enum DeviceType {
	DEVICE_TYPE_UNKNOW = 0;
	DEVICE_TYPE_PC = 1;             //PC
	DEVICE_TYPE_ANDROID = 2;        //��׿
	DEVICE_TYPE_IOS = 3;            //IOS
}

enum Command {
	COMMAND_UNKNOW = 0;
	COMMAND_HANDSHAKE_REQ = 1; //�������󣬺�http��websocket��������
	COMMAND_HANDSHAKE_RESP = 2; //������Ӧ����http��websocket������Ӧ
	COMMAND_AUTH_REQ = 3; //��Ȩ����
	COMMAND_AUTH_RESP = 4; // ��Ȩ��Ӧ
	COMMAND_JOIN_GROUP_REQ = 5; //�������Ⱥ��
	COMMAND_JOIN_GROUP_RESP = 6; //�������Ⱥ����Ӧ
	COMMAND_JOIN_GROUP_NOTIFY_RESP = 7; //���뷿��֪ͨ
	COMMAND_CHAT_REQ = 8; //��������
	COMMAND_CHAT_RESP = 9; //������Ӧ
	COMMAND_START_SHOW_REQ = 10; //��������
	COMMAND_START_SHOW_RESP = 11; //������Ӧ
	COMMAND_END_SHOW_REQ = 12; //ͣ������
	COMMAND_END_SHOW_NOTIFY_RESP = 13; //ͣ��֪ͨ
	COMMAND_HEARTBEAT_REQ = 14; //��������
	COMMAND_CLOSE_REQ = 15; //�ر�����
}

/**
 * ��Ȩ����
 */
message AuthReqBody {
	int64 time = 1;//��Ϣ����ʱ��
	string deviceId = 2;// device id(�ֻ��豸id)
	string token = 3;
	DeviceType deviceType = 4;//clienttype�ͻ�������1-pc 2-android 3-ios
	string cid = 5;//������
	string appVersion = 6;//app�汾��
	string deviceInfo = 7;//�ֻ��ͺ���Ϣ��Ʃ�绪Ϊĳ�ͺ�
	int64 seq = 8;//���к�
 	string sign = 9;//ǩ��
}

/**
 * ��Ȩ��Ӧ
 */
message AuthRespBody {
	int64 time = 1;//��Ϣ����ʱ��
}

/**
 * ����Ⱥ������
 */
message JoinReqBody {
	int64 time = 1;//��Ϣ����ʱ��
	string group = 2;
}


/**
 * ����Ⱥ������Ľ��
 */
enum JoinGroupResult {
	JOIN_GROUP_RESULT_UNKNOW = 0;//��������룬ԭ��Ϊ����
	JOIN_GROUP_RESULT_OK = 1;//�������
	JOIN_GROUP_RESULT_NOT_EXIST = 2;//�鲻����
	JOIN_GROUP_RESULT_GROUP_FULL = 3;//����
	JOIN_GROUP_RESULT_IN_BACKLIST = 4;//�ں�������
	JOIN_GROUP_RESULT_TAKEOUTED = 5;//����
}

/**
 * ����Ⱥ����Ӧ
 */
message JoinRespBody {
	int64 time = 1;//��Ϣ����ʱ��
	JoinGroupResult result = 2;
	string group = 3;
}

/**
 * ��������
 */
enum ChatType {
	CHAT_TYPE_UNKNOW = 0;//δ֪
	CHAT_TYPE_PUBLIC = 1;//����
	CHAT_TYPE_PRIVATE = 2;//˽��
}
/**
 * ��������
 */
message ChatReqBody {
	int64 time = 1;//��Ϣ����ʱ��
	ChatType type = 2; //��������
	string text = 3; //��������
	string group = 4; //Ŀ����id
	int32 toId = 5; //Ŀ���û�id��
	string toNick = 6; //Ŀ���û�nick
}

/**
 * ������Ӧ
 */
message ChatRespBody {
	int64 time = 1;//��Ϣ����ʱ��
	ChatType type = 2; //��������
	string text = 3; //��������
	int32 fromId = 4; //����������Ϣ���û�id
	string fromNick = 5; //����������Ϣ���û�nick
	int32 toId = 6; //Ŀ���û�id
	string toNick = 7; //Ŀ���û�nick
	string group = 8; //Ŀ����id
}


/**
 * ��ʼֱ������
 */
message BeginToLiveReqBody {
	int64 time = 1;//��Ϣ����ʱ��
}

/**
 * ��ʼֱ����Ӧ
 */
message BeginToLiveRespBody {
	int64 time = 1;//��Ϣ����ʱ��
	int64 liveid = 2;       //����ֱ��id
	string rtmppublishurl = 3;  //rtmp������ַ
	string rtmpliveurl = 4;  //rtmp���ŵ�ַ
}

/**
 * ����ֱ������
 */
message EndLiveReqBody {
	int64 time = 1;//��Ϣ����ʱ��
}

/**
 * ����ֱ����Ӧ
 */
message EndLiveRespBody {
	int64 time = 1;//��Ϣ����ʱ��
	int64 liveid = 2;       //����ֱ��id
}

</code></pre>

<p>&nbsp;</p>

	
	</li>
	
	
	<li>
	<h2><strong>�ù��߰�protoԴ�ļ����������Ҫ�Ĵ���</strong></h2>
	<ol>
		<li><h3><strong>���ز���װ����</strong></h3>
		�ȸ��ṩ�Ĺ���protoc.exe�����԰�protoԴ�ļ�����java��c++��python����������Ӧ�Ĵ��룬���������<a href="https://github.com/google/protobuf" target="_blank">https://github.com/google/protobufo</a>�п����ҵ����������û�ҵ���Ϊ�˴�ҵķ��㣬�����Ѿ��ϴ���t-io�Ĺ��̣�����<a href="https://git.oschina.net/tywo45/t-io" target="_blank">https://git.oschina.net/tywo45/t-io</a>��Ȼ���ҵ�docs/toolsĿ¼��������protoc.exe�ļ������غ󣬰�protoc.exe����Ŀ¼��ӵ����path��
		</li>
		
		<li><h3><strong>ִ���������ɴ���</strong></h3>
		<pre><code class="language-bash">md .\src\c
md .\src\java

protoc.exe --cpp_out=.\src\c chat.proto
protoc.exe --java_out=.\src\java chat.proto</code></pre>
		<a href="https://www.oschina.net/p/t-io" target="_blank">t-io</a>�ṩ���ֳɵĽű���λ����<a href="https://git.oschina.net/tywo45/t-io" target="_blank">https://git.oschina.net/tywo45/t-io</a>��"src/example/im/common/src/main/protobuf"Ŀ¼����ҿ���ֱ�������Ǹ�generate.bat�ű����������ɵĴ��볤ʲô�������������γɸ�����ʶ������������һ���ǲ������������ɵĴ����ϸ�ڵģ�����ֻ��ע����������������ı���ʾ���ͽ���ʾ����
		</li>

		<li><h3><strong>�����ɵĴ��븴�Ƶ���Ĺ���Ŀ¼</strong></h3>
			�ԣ������и���
		</li>
	</ol>
	

	
	</li>
	
	
	<li>
	<h2><strong>protobuf��t-io�е�����</strong></h2>
	
	<ol>
		<li><h3><strong>�������jar</strong></h3>
			java��Ҫ��protobuf��������Ҫ������ص�jar��maven��pom��������
	<pre>
<code class="language-xml">&lt;dependency&gt;
	&lt;groupId&gt;com.google.protobuf&lt;/groupId&gt;
	&lt;artifactId&gt;protobuf-java&lt;/artifactId&gt;
	&lt;version&gt;3.2.0&lt;/version&gt;
&lt;/dependency&gt;</code></pre>
		</li>

		<li><h3><strong>����ʾ��</strong></h3>
			�����Ǵ�javaת��Ϊbyte[]��������
			<pre>
<code class="language-java">ChatRespBody.Builder builder = ChatRespBody.newBuilder();
builder.setType(chatReqBody.getType());
builder.setText(chatReqBody.getText());
builder.setFromId(fromId);
builder.setFromNick(fromNick);
builder.setToId(toId);
builder.setToNick(toNick);
builder.setGroup(toGroup);
builder.setTime(SystemTimer.currentTimeMillis());
ChatRespBody chatRespBody = builder.build();
byte[] bodybyte = chatRespBody.toByteArray();</code></pre>
������:org.tio.examples.im.remote.handler.ChatReqHandler.handler(ImPacket, ChannelContext)��

		</li>
		<li><h3><strong>����ʾ��</strong></h3>
			�����Ǵ�byte[]ת��Ϊjava���󣬼�����
			<pre>
<code class="language-java">ChatReqBody chatReqBody = ChatReqBody.parseFrom(packet.getBody());</code></pre>
������:org.tio.examples.im.remote.handler.ChatReqHandler.handler(ImPacket, ChannelContext)��
		</li>
	</ol>


	
	</li>
	
	
	<li>
	<h2><strong>��չ֪ʶ</strong></h2>

		<ol>
			<li><h3><strong>protobuf��json�໥ת��</strong></h3>
			������ο�<a href="https://github.com/bivas/protobuf-java-format" target="_blank">https://github.com/bivas/protobuf-java-format</a>
			

			<ol>
				<li>
					����jar
					<pre>
<code class="language-xml">&lt;dependency&gt;
	&lt;groupId&gt;com.googlecode.protobuf-java-format&lt;/groupId&gt;
	&lt;artifactId&gt;protobuf-java-format&lt;/artifactId&gt;
	&lt;version&gt;1.4&lt;/version&gt;
&lt;/dependency&gt;</code></pre>
				</li>

				<li>
					��protobufתjson
					<pre>
<code class="language-java">Message someProto = SomeProto.getDefaultInstance();
JsonFormat jsonFormat = new JsonFormat();
String asJson = jsonFormat.printToString(someProto);</code></pre>

				</li>

				<li>
					��jsonתprotobuf
					<pre>
<code class="language-java">Message.Builder builder = SomeProto.newBuilder();
String asJson = "{\"name\":\"tan\"}";
JsonFormat jsonFormat = new JsonFormat();
jsonFormat.merge(asJson, builder);</code></pre>
				</li>

			</ol>

			

			</li>


		</ol>
		



	</li>
	
	
</ol>
